<?php
class car
{
    public function action()
    {
        echo '正在加速';
    }
    public function __call($name, $arguments)//如果调用的方法在类里面不存在的时候，它将被触发。
    {
        //第一个参数是方法名,第二个参数是方法参数,以数组形式传入
        // TODO: Implement __call() method.
        /*var_export($name);
        var_export($arguments);*/

        //call_user_func_array("函数名","数组")：调用一个函数或者一个类中的某个成员函数
        //echo call_user_func_array($name,$arguments);//调用max(array(1,2,3,4))

        //strpos(必需。规定被搜索的字符串。,必需。规定要查找的字符。,可选。规定开始搜索的位置。)函数查找字符串在另一字符串中第一次出现的位置（区分大小写）。
        //echo strpos('123456','45');

        if (strpos($name,'SET')===0)
        {
            var_export($arguments);
        }else{
            if (function_exists($name))
            {
                echo call_user_func_array($name,$arguments);
            }else{
                echo '未知函数';
            }
        }
    }
    public static function __callStatic($name,$arguments)//如果调用的静态方法在类里面不存在的时候，它将被触发。
    {
        var_export($name);
        var_export($arguments);
        echo '这是name：'.$name;
        echo '这里是静态方法参数：';
        var_export($arguments);
    }
    public function __toString()//把类进行echo的时候触发
    {
        // TODO: Implement __toString() method.
        //return 'hello php';
        //return (string)array(1,2,3,4,5);//输出Array
        $arr=array(
            'name'=>'php',
            'pwd'=>'123456'
        );
        echo 'name||||php@pwd||||123456';
        return json_encode($arr);
    }

    public function __invoke($name,$key)//把类一个函数的形式触发,有设置参数必须传参数，否则会出错
    {
        // TODO: Implement __invoke() method.
        //echo '把类当成函数来用';
        echo "name:".$name;
        echo "key:".$key;
    }


    public static function min()
    {
        echo '这里是静态方法';
    }
}
$car=new car();
//$car->abc(array(1,2,3,4),123);//触发__call()
//$name='abc'
//$arguments=array ( 0 => array ( 0 => 1, 1 => 2, 2 => 3, 3 => 4, ), 1 => 123, )

//$car->max(array(1,2,3,4,5));//触发__call(),调用max(array(1,2,3,4))

/*$car->SETmax(array(1,2,3,4,5));//触发__call()
echo "<hr/>";
$car->max(array(1,2,3,4,5));//触发__call()
echo "<hr/>";
$car->abc(array(1,2,3,4));//触发__call()*/

/*car::min();
car::max(array(1,2,3,4,5));//触发__callStatic()*/


//echo $car;//出错，把类进行echo的时候触发__toString()，用__toString()就不会出错
//var_export($car);//输出car::__set_state(array( ))

/*$arr=array(
    'work'=>1,
    'task'=>2
);
$json=json_encode($arr);
echo $json;
echo "<hr/>";
$arr=json_decode($json,true);
var_export($arr);
echo "<hr/>";
$arr=json_decode($json);//stdClass::__set_state(array( 'work' => 1, 'task' => 2, ))
var_export($arr);*/

$car('php',123);//触发__invoke()
